import numpy as np

# 假设查询和键的所有元素都是独立的随机变量， 并且都满足零均值和单位方差， 那么两个向量的点积的均值为0，方差为d。
# 设置随机种子以便结果可复现
# np.random.seed(0)


# 设置向量维度
d = 10
dot_products_q = []
dot_products_k = []
dot_products = []

for i in range(10000):
    # 生成查询向量和键向量，每个元素都是零均值、单位方差的随机变量
    q = np.random.randn(d)
    k = np.random.randn(d)
    # print("q={},k={}".format(q,k))
    # 计算点积
    dot_product = np.dot(q, k)
    # print("dot_product={}".format(dot_product))
    dot_products.append(dot_product)

# 计算均值和方差
mean_dot_product = np.mean(dot_products)
var_dot_product = np.var(dot_products)

print(f"模拟的点积均值: {mean_dot_product:.2f}")
print(f"模拟的点积方差: {var_dot_product:.2f}")
print(f"理论的点积均值: 0")
print(f"理论的点积方差: {d}")
